package BL;

import java.sql.*;
import java.util.EmptyStackException;

public class AccessDB {

	private static String connection = "/Users/julianruess/Documents/201301_Java_Projekt/HSQLDB_AroundMe";

	public AccessDB() {
		super();
	}

	public static void addEintrag(Eintrag eintrag, String subkat, String user)
			throws SQLException, ClassNotFoundException, EmptyStackException {
		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");

		// SQL-Anweisungs-Objekt erzeugen
		Statement st = con.createStatement();

		// ueberpruefen ob Eintrag mit Namen schon vorhanden ist (in
		// Abhaengigkeit von subkat)
		ResultSet rs = st
				.executeQuery("Select id from subkategorien where name = '"
						+ subkat + "'");
		rs.next();
		int subkatID = Integer.parseInt(rs.getString(1));

		rs = st.executeQuery("Select KategorieID from katverknuepfung where subkategorieID = '"
				+ subkatID + "'");
		rs.next();
		int katID = Integer.parseInt(rs.getString(1));

		rs = st.executeQuery("Select count(id) from Eintraege where UPPER(Name) = '"
				+ eintrag.getName().toUpperCase() + "'");
		rs.next();

		if (Integer.parseInt(rs.getString(1)) != 0) {
			rs = st.executeQuery("Select id from Eintraege where UPPER(Name) = '"
					+ eintrag.getName().toUpperCase() + "'");
			rs.next();
			int idE = Integer.parseInt(rs.getString(1));

			rs = st.executeQuery("Select kategorieID from Verknuepfung where EintragID = "
					+ idE);
			rs.next();
			int idS = Integer.parseInt(rs.getString(1));

			if (idS == katID) {
				throw new EmptyStackException();
			}
		}

		int neueEID;
		do {
			neueEID = (int) (Math.random() * 1000);
			rs = st.executeQuery("select count(*) from Eintraege where id = "
					+ neueEID);
			rs.next();
		} while (Integer.parseInt(rs.getString(1)) != 0);

		st.executeUpdate("INSERT INTO Eintraege ( ID , NAME, BESCHREIBUNG , BEWERTUNG , LAT , LANG, OZ1, OZ2 , OZ3 , OZ4 , OZ5 , OZ6 , OZ7 , OZ8 , OZ9 , OZ10 , OZ11 , OZ12 , OZ13 , OZ14 , OZ15 , OZ16 , OZ17 , OZ18 , OZ19 , OZ20 , OZ21 , OZ22 , OZ23 , OZ24 , OZ25 , OZ26 , OZ27 , OZ28  ) Values ("
				+ neueEID
				+ ", '"
				+ eintrag.getName()
				+ "', '"
				+ eintrag.getBeschreibung()
				+ "', "
				+ eintrag.getBewertung()
				+ ", "
				+ eintrag.getLat()
				+ ", "
				+ eintrag.getLang()
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[1][0])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[1][1])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[1][2])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[1][3])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[2][0])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[2][1])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[2][2])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[2][3])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[3][0])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[3][1])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[3][2])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[3][3])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[4][0])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[4][1])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[4][2])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[4][3])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[5][0])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[5][1])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[5][2])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[5][3])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[6][0])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[6][1])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[6][2])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[6][3])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[7][0])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[7][1])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[7][2])
				+ ", "
				+ setZeitNull(eintrag.getOeffnungszeiten()[7][3]) + ")");

		st.executeUpdate("INSERt into verknuepfung (EintragID, KategorieID, SubkategorieID) Values("
				+ neueEID + "," + katID + "," + subkatID + ")");

		rs.close();
		st.close();
		con.close();
	}

	public static void deleteEintrag(String eintr_name, String subkat)
			throws SQLException, ClassNotFoundException, EmptyStackException {
		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");

		// SQL-Anweisungs-Objekt erzeugen
		Statement st = con.createStatement();

		ResultSet rs = st
				.executeQuery("Select count(*) from eintraege where name = '"
						+ eintr_name + "'");
		rs.next();
		if (Integer.parseInt(rs.getString(1)) == 1) {
			rs = st.executeQuery("Select id from eintraege where name = '"
					+ eintr_name + "'");
			rs.next();
			int eID = Integer.parseInt(rs.getString(1));
			rs = st.executeQuery("Select id from subkategorien where name = '"
					+ subkat + "'");
			rs.next();
			int sID = Integer.parseInt(rs.getString(1));
			st.executeUpdate("Delete from verknuepfung where eintragid = "
					+ eID + " AND subkategorieid = " + sID);
			st.executeUpdate("Delete from UsrVerknuepfung where eintragid = "
					+ eID);

			st.executeUpdate("Delete from eintraege where name = '"
					+ eintr_name + "'");
		}

		st.close();
		con.close();
	}

	public static String[] getEintraegeName(String subKat) throws SQLException,
			ClassNotFoundException {
		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");

		// SQL-Anweisungs-Objekt erzeugen
		Statement st = con.createStatement();

		// ID fuer Subkategorie rausfinden
		ResultSet rs = st
				.executeQuery("Select id from Subkategorien where name = '"
						+ subKat + "'");
		rs.next();
		int subKatID = Integer.parseInt(rs.getString(1));

		// Katverknuepfung nach subkatID durchsuchen um Eintraege dazu
		// rauszufinden
		rs = st.executeQuery("Select count(EintragID) from verknuepfung where subkategorieid = "
				+ subKatID);
		rs.next();
		int anzEintr = Integer.parseInt(rs.getString(1));
		int[] eintragIDs = new int[anzEintr];

		rs = st.executeQuery("Select EintragID from verknuepfung where subkategorieid = "
				+ subKatID);

		int i = 0;
		while (rs.next()) {
			eintragIDs[i] = Integer.parseInt(rs.getString(1));
			i++;
		}

		String[] eintraege = new String[anzEintr];
		// Eintraege nach IDs untersuchen
		for (i = 0; i < eintragIDs.length; i++) {
			rs = st.executeQuery("Select * from eintraege where id = "
					+ eintragIDs[i]);
			rs.next();
			eintraege[i] = new String(rs.getString(2));
		}

		rs.close();
		st.close();
		con.close();

		return eintraege;
	}

	public static Eintrag getEintrag(String subKat, String eintragName)
			throws SQLException, ClassNotFoundException {
		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");

		// SQL-Anweisungs-Objekt erzeugen
		Statement st = con.createStatement();

		// ID fuer Subkategorie rausfinden
		ResultSet rs = st
				.executeQuery("Select id from Subkategorien where name = '"
						+ subKat + "'");
		rs.next();
		int subKatID = Integer.parseInt(rs.getString(1));

		// Katverknuepfung nach subkatID durchsuchen um Eintraege dazu
		// rauszufinden
		rs = st.executeQuery("Select count(EintragID) from verknuepfung where subkategorieid = "
				+ subKatID);
		rs.next();
		int anzEintr = Integer.parseInt(rs.getString(1));
		int[] eintragIDs = new int[anzEintr];

		rs = st.executeQuery("Select EintragID from verknuepfung where subkategorieid = "
				+ subKatID);

		int i = 0;
		while (rs.next()) {
			eintragIDs[i] = Integer.parseInt(rs.getString(1));
			i++;
		}

		Eintrag eintrag = new Eintrag();
		// Eintraege nach IDs untersuchen
		for (i = 0; i < eintragIDs.length; i++) {
			rs = st.executeQuery("Select count(*) from eintraege where id = "
					+ eintragIDs[i] + " AND name = '" + eintragName + "'");
			rs.next();
			if (Integer.parseInt(rs.getString(1)) != 0) {
				rs = st.executeQuery("Select * from eintraege where id = "
						+ eintragIDs[i] + " AND name = '" + eintragName + "'");
				rs.next();
				eintrag.setID(Integer.parseInt(rs.getString(1)));
				eintrag.setName(rs.getString(2));
				eintrag.setBeschreibung(rs.getString(3));
				eintrag.setBewertung(Integer.parseInt(rs.getString(4)));
				eintrag.setLat(Double.parseDouble(rs.getString(5)));
				eintrag.setLang(Double.parseDouble(rs.getString(6)));
				eintrag.setOeffnungszeiten(eintrag.erstelleOeffnungszeiten(
						Integer.parseInt(rs.getString(7)),
						Integer.parseInt(rs.getString(8)),
						Integer.parseInt(rs.getString(9)),
						Integer.parseInt(rs.getString(10)),
						Integer.parseInt(rs.getString(11)),
						Integer.parseInt(rs.getString(12)),
						Integer.parseInt(rs.getString(13)),
						Integer.parseInt(rs.getString(14)),
						Integer.parseInt(rs.getString(15)),
						Integer.parseInt(rs.getString(16)),
						Integer.parseInt(rs.getString(17)),
						Integer.parseInt(rs.getString(18)),
						Integer.parseInt(rs.getString(19)),
						Integer.parseInt(rs.getString(20)),
						Integer.parseInt(rs.getString(21)),
						Integer.parseInt(rs.getString(22)),
						Integer.parseInt(rs.getString(23)),
						Integer.parseInt(rs.getString(24)),
						Integer.parseInt(rs.getString(25)),
						Integer.parseInt(rs.getString(26)),
						Integer.parseInt(rs.getString(27)),
						Integer.parseInt(rs.getString(28)),
						Integer.parseInt(rs.getString(29)),
						Integer.parseInt(rs.getString(30)),
						Integer.parseInt(rs.getString(31)),
						Integer.parseInt(rs.getString(32)),
						Integer.parseInt(rs.getString(33)),
						Integer.parseInt(rs.getString(34))));
			}

		}

		rs.close();
		st.close();
		con.close();

		return eintrag;
	}

	public static Eintrag getEintrag(int id) throws SQLException,
			ClassNotFoundException {
		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");

		// SQL-Anweisungs-Objekt erzeugen
		Statement st = con.createStatement();

		// ID fuer Subkategorie rausfinden
		ResultSet rs = st.executeQuery("Select * from eintraege where id = '"
				+ id + "'");
		rs.next();

		Eintrag eintrag = new Eintrag();
		// Eintraege nach IDs untersuchen

		eintrag.setID(Integer.parseInt(rs.getString(1)));
		eintrag.setName(rs.getString(2));
		eintrag.setBeschreibung(rs.getString(3));
		eintrag.setBewertung(Integer.parseInt(rs.getString(4)));
		eintrag.setLat(Double.parseDouble(rs.getString(5)));
		eintrag.setLang(Double.parseDouble(rs.getString(6)));
		eintrag.setOeffnungszeiten(eintrag.erstelleOeffnungszeiten(
				Integer.parseInt(rs.getString(7)),
				Integer.parseInt(rs.getString(8)),
				Integer.parseInt(rs.getString(9)),
				Integer.parseInt(rs.getString(10)),
				Integer.parseInt(rs.getString(11)),
				Integer.parseInt(rs.getString(12)),
				Integer.parseInt(rs.getString(13)),
				Integer.parseInt(rs.getString(14)),
				Integer.parseInt(rs.getString(15)),
				Integer.parseInt(rs.getString(16)),
				Integer.parseInt(rs.getString(17)),
				Integer.parseInt(rs.getString(18)),
				Integer.parseInt(rs.getString(19)),
				Integer.parseInt(rs.getString(20)),
				Integer.parseInt(rs.getString(21)),
				Integer.parseInt(rs.getString(22)),
				Integer.parseInt(rs.getString(23)),
				Integer.parseInt(rs.getString(24)),
				Integer.parseInt(rs.getString(25)),
				Integer.parseInt(rs.getString(26)),
				Integer.parseInt(rs.getString(27)),
				Integer.parseInt(rs.getString(28)),
				Integer.parseInt(rs.getString(29)),
				Integer.parseInt(rs.getString(30)),
				Integer.parseInt(rs.getString(31)),
				Integer.parseInt(rs.getString(32)),
				Integer.parseInt(rs.getString(33)),
				Integer.parseInt(rs.getString(34))));

		rs.close();
		st.close();
		con.close();

		return eintrag;
	}

	/*
	 * public static Eintrag[] getEintraege(String subKat) throws SQLException,
	 * ClassNotFoundException { Class.forName("org.hsqldb.jdbcDriver");
	 * Connection con = DriverManager.getConnection("jdbc:hsqldb:file:" +
	 * connection + ";shutdown=true", "sa", "");
	 * 
	 * // SQL-Anweisungs-Objekt erzeugen Statement st = con.createStatement();
	 * 
	 * // ID fuer Subkategorie rausfinden ResultSet rs = st
	 * .executeQuery("Select id from Subkategorien where name = '" + subKat +
	 * "'"); rs.next(); int subKatID = Integer.parseInt(rs.getString(1));
	 * 
	 * // Katverknuepfung nach subkatID durchsuchen um Eintraege dazu //
	 * rauszufinden rs = st.executeQuery(
	 * "Select count(EintragID) from verknuepfung where subkategorieid = " +
	 * subKatID); rs.next(); int anzEintr = Integer.parseInt(rs.getString(1));
	 * int[] eintragIDs = new int[anzEintr];
	 * 
	 * rs =
	 * st.executeQuery("Select EintragID from verknuepfung where subkategorieid = "
	 * + subKatID);
	 * 
	 * int i = 0; while (rs.next()) { eintragIDs[i] =
	 * Integer.parseInt(rs.getString(1)); i++; }
	 * 
	 * Eintrag[] eintraege = new Eintrag[anzEintr]; // Eintraege nach IDs
	 * untersuchen for (i = 0; i < eintragIDs.length; i++) { rs =
	 * st.executeQuery("Select * from eintraege where id = " + eintragIDs[i]);
	 * eintraege[i] = new Eintrag();
	 * eintraege[i].setID(Integer.parseInt(rs.getString(1)));
	 * eintraege[i].setName(rs.getString(2));
	 * eintraege[i].setBeschreibung(rs.getString(3));
	 * eintraege[i].setBewertung(Integer.parseInt(rs.getString(4)));
	 * eintraege[i].setLat(Double.parseDouble(rs.getString(5)));
	 * eintraege[i].setLang(Double.parseDouble(rs.getString(6)));
	 * eintraege[i].erstelleOeffnungszeiten( Integer.parseInt(rs.getString(7)),
	 * Integer.parseInt(rs.getString(8)), Integer.parseInt(rs.getString(9)),
	 * Integer.parseInt(rs.getString(10)), Integer.parseInt(rs.getString(11)),
	 * Integer.parseInt(rs.getString(12)), Integer.parseInt(rs.getString(13)),
	 * Integer.parseInt(rs.getString(14)), Integer.parseInt(rs.getString(15)),
	 * Integer.parseInt(rs.getString(16)), Integer.parseInt(rs.getString(17)),
	 * Integer.parseInt(rs.getString(18)), Integer.parseInt(rs.getString(19)),
	 * Integer.parseInt(rs.getString(20)), Integer.parseInt(rs.getString(21)),
	 * Integer.parseInt(rs.getString(22)), Integer.parseInt(rs.getString(23)),
	 * Integer.parseInt(rs.getString(24)), Integer.parseInt(rs.getString(25)),
	 * Integer.parseInt(rs.getString(26)), Integer.parseInt(rs.getString(27)),
	 * Integer.parseInt(rs.getString(28)), Integer.parseInt(rs.getString(29)),
	 * Integer.parseInt(rs.getString(30)), Integer.parseInt(rs.getString(31)),
	 * Integer.parseInt(rs.getString(32)), Integer.parseInt(rs.getString(33)),
	 * Integer.parseInt(rs.getString(34))); }
	 * 
	 * rs.close(); st.close(); con.close();
	 * 
	 * return eintraege; }
	 */

	public static String[] getKat() throws SQLException, ClassNotFoundException {
		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");

		// SQL-Anweisungs-Objekt erzeugen
		Statement st = con.createStatement();

		ResultSet rs = st.executeQuery("Select  count(Name) from Kategorien");
		rs.next();
		int laenge = Integer.parseInt(rs.getString(1));

		rs.close();

		rs = st.executeQuery("Select name from Kategorien ");

		String[] kat = new String[laenge];

		int i = 0;
		while (rs.next()) {
			kat[i] = new String(rs.getString(1));
			i++;
		}

		rs.close();
		st.close();
		con.close();

		return kat;
	}

	public static void addKat(String kat, String subKat) throws SQLException,
			ClassNotFoundException, EmptyStackException {

		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");

		// SQL-Anweisungs-Objekt erzeugen
		Statement st = con.createStatement();

		// Prüfen ob Kategorie schon vorhanden (2 Faelle)
		ResultSet rs = st.executeQuery("Select * from Kategorien");

		boolean katVorhanden = false;
		int katID = 0;
		while (rs.next()) {
			if (kat.equals(rs.getString(2))) {
				// Fall 1
				katVorhanden = true;
				katID = Integer.parseInt(rs.getString(1));
			}
		}
		if (katVorhanden) {
			// Fall 1: Kategorie Vorhanden: nur Subkategorie hinzufuegen

			// Schauen ob Subkat schon vorhanden
			rs = st.executeQuery("select s.name from subkategorien s, katverknuepfung kv  where s.id = kv.subkategorieid AND kv.kategorieid ="
					+ katID);
			while (rs.next()) {
				if (subKat.equals(rs.getString(1))) {
					throw new EmptyStackException();
				}
			}

			// In Subkategorien: Anzahl fuer ID bestimmen
			rs = st.executeQuery("select count(id) from subkategorien");
			rs.next();
			int neueSID = (Integer.parseInt(rs.getString(1))) + 1;

			// In Subkategorien: Neue Subkategorie hinzufuegen
			st.executeUpdate("INSERT INTO Subkategorien (ID, Name) Values ( "
					+ neueSID + " , '" + subKat + "')");

			// Verbindung zu bestehende Kategorie herstellen
			st.executeUpdate("INSERt into katverknuepfung (KategorieID, SubkategorieID) Values("
					+ katID + "," + neueSID + ")");

		} else {
			// Fall 2: Kategorie und Subkategorie hinzufuegen

			// Ueberpruefen ob schon vorhanden
			rs = st.executeQuery("select name from kategorien");
			while (rs.next()) {
				if (kat.equals(rs.next())) {
					throw new EmptyStackException();
				}
			}

			// In Kategorien: Anzahl fuer ID bestimmen
			// rs = st.executeQuery("select count(id) from Kategorien");
			// rs.next();
			// int neueKID = (Integer.parseInt(rs.getString(1))) + 1;
			int neueKID;
			do {
				neueKID = (int) (Math.random() * 100);
				rs = st.executeQuery("select count(*) from Kategorien where id = "
						+ neueKID);
				rs.next();
			} while (Integer.parseInt(rs.getString(1)) != 0);

			// In Kategorien: Neue Kategorie hinzufuegen
			st.executeUpdate("INSERT INTO Kategorien (ID, NAME) Values ("
					+ neueKID + ", '" + kat + "')");

			// In Subkategorien: Anzahl fuer ID bestimmen
			rs = st.executeQuery("select count(id) from subkategorien");
			rs.next();
			int neueSID = (Integer.parseInt(rs.getString(1))) + 1;

			// In Subkategorien: Neue Subkategorie hinzufuegen
			st.executeUpdate("INSERT INTO Subkategorien (ID, Name) Values ( "
					+ neueSID + " , '" + subKat + "')");

			// Verbindung von beiden neuen Eintraegen herstellen
			st.executeUpdate("INSERt into katverknuepfung (KategorieID, SubkategorieID) Values("
					+ neueKID + "," + neueSID + ")");
		}

		rs.close();
		st.close();
		con.close();
	}

	public static void deleteKat(String subKat) throws SQLException,
			ClassNotFoundException {

		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");

		// SQL-Anweisungs-Objekt erzeugen
		Statement st = con.createStatement();

		// //Verknuepfung loeschen um Subkat zu loeschen
		// ID von Subkat ermitteln
		ResultSet rs = st
				.executeQuery("Select id from Subkategorien where name = '"
						+ subKat + "' ");
		rs.next();
		int sID = Integer.parseInt(rs.getString(1));

		rs = st.executeQuery("Select kategorieid from katverknuepfung where subkategorieid = "
				+ sID);
		rs.next();
		int katIDvonSID = Integer.parseInt(rs.getString(1));

		// //letzter Eintrag von Subkat in geloeschte ID eintragen
		// Id letzter Eintrag Ermitteln
		rs = st.executeQuery("Select count(id) from Subkategorien ");
		rs.next();
		int letzteSubKatID = (Integer.parseInt(rs.getString(1)));
		rs = st.executeQuery("Select name from Subkategorien where id =  "
				+ letzteSubKatID);
		rs.next();
		String letzteSubKatName = rs.getString(1);

		// letzter Subkat mit SID versehen
		rs = st.executeQuery("Select subKategorieid from katverknuepfung where subkategorieid = "
				+ letzteSubKatID);
		rs.next();
		int letzteSubKatKATID = (Integer.parseInt(rs.getString(1)));

		// Verk loeschen
		st.executeUpdate("Delete from Katverknuepfung where SubkategorieID = "
				+ sID);

		// Subkat loeschen
		st.executeUpdate("Delete from Subkategorien where id = " + sID);

		// Wenn die letzte Subkategorie geloescht wurde, muss nicht umsortiert
		// werden
		if (sID != letzteSubKatKATID) {
			st.executeUpdate("Delete from katverknuepfung where subkategorieid ="
					+ letzteSubKatID);
			// st.executeUpdate("Update Subkategorien Set id="+sID+" where id = "+letzteSubKatID);
			st.executeUpdate("Delete from Subkategorien where id = "
					+ letzteSubKatID);
			st.executeUpdate("Insert into Subkategorien (id,Name) values ("
					+ sID + ",'" + letzteSubKatName + "' )");
			st.executeUpdate("INSERT INTO Katverknuepfung (kategorieid, subkategorieid) values ("
					+ letzteSubKatKATID + " ," + sID + " )");
		}

		// Falls letzte Subkat! Kat loeschen
		rs = st.executeQuery("Select count(kategorieid) from katverknuepfung where kategorieid =  "
				+ katIDvonSID);
		rs.next();
		int anzahlsubKatvongeloeschteKat = (Integer.parseInt(rs.getString(1)));
		if (anzahlsubKatvongeloeschteKat == 0) {
			// kat loeschen
			st.executeUpdate("Delete from kategorien where id =" + katIDvonSID);

		}

		rs.close();
		st.close();
		con.close();
	}

	public static String[][] getKatANDSubKat() throws SQLException,
			ClassNotFoundException {
		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");

		// SQL-Anweisungs-Objekt erzeugen

		Statement st = con.createStatement();

		// Abfrage für Anzahl SubKategorien

		ResultSet rs = st.executeQuery("Select count(ID) from subKategorien");
		rs.next();
		int anzSubKat = Integer.parseInt(rs.getString(1));

		String[][] kat = new String[anzSubKat][2];

		// Abfrage für zusammengehörende Kategorien mit Subkategorien

		rs = st.executeQuery("Select k.Name, s.Name From Kategorien k, Subkategorien s, Katverknuepfung v Where k.ID = v.KategorieID And v.SubkategorieID = s.ID");
		int i = 0;
		while (rs.next()) {
			kat[i][0] = new String(rs.getString(1));
			kat[i][1] = new String(rs.getString(2));
			i++;
		}

		rs.close();
		st.close();
		con.close();

		return kat;
	}

	public static String[] getSubKat(String kat) throws SQLException,
			ClassNotFoundException {

		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");

		// SQL-Anweisungs-Objekt erzeugen

		Statement st = con.createStatement();

		// Abfrage für KategorieID

		ResultSet rs = st
				.executeQuery("select ID from Kategorien where Name = '" + kat
						+ "'");
		rs.next();
		int katID = Integer.parseInt(rs.getString(1));

		// Abfrage für ANZAHL zusammengehörende SubkategorienID der KategorieID

		rs = st.executeQuery("select count(subkategorieid) from katverknuepfung where kategorieid = "
				+ katID);

		rs.next();
		int laenge = Integer.parseInt(rs.getString(1));

		// Abfrage für zusammengehörende SubkategorienID der KategorieID

		rs = st.executeQuery("select subkategorieid from katverknuepfung where kategorieid = "
				+ katID);

		String[] subKatID = new String[laenge];
		String[] subKat = new String[laenge];
		int i = 0;
		while (rs.next()) {
			subKatID[i] = new String(rs.getString(1));
			i++;
		}

		// Abfragen für Subkategorie Namen der ermittelten SubkatID

		for (i = 0; i < subKatID.length; i++) {
			rs = st.executeQuery("select Name from subkategorien where ID = "
					+ subKatID[i]);
			rs.next();
			subKat[i] = rs.getString(1);
		}

		rs.close();
		st.close();
		con.close();

		return subKat;
	}

	public static int getAnzEintraege(String subKat) throws SQLException,
			ClassNotFoundException {
		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");
		// SQL-Anweisungs-Objekt erzeugen
		Statement st = con.createStatement();

		// subKat = subKat.toUpperCase();
		ResultSet rs = st
				.executeQuery("select count(e.id) from subkategorien s, verknuepfung v, eintraege e where e.ID = v.eintragID AND s.id = v.subkategorieid AND s.name = '"
						+ subKat + "'");
		rs.next();
		int anzE = Integer.parseInt(rs.getString(1));

		rs.close();
		st.close();
		con.close();

		return anzE;
	}

	// select count(e.id) from subkategorien s, verknuepfung v, eintraege e
	// where e.ID = v.eintragID AND s.id = v.subkategorieid AND s.name =
	// 'Italiener'

	public static Eintrag[] getErgebnisliste(String kat) throws SQLException,
			ClassNotFoundException {
		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");
		// SQL-Anweisungs-Objekt erzeugen
		Statement st = con.createStatement();

		kat = kat.toUpperCase();
		ResultSet rs = st
				.executeQuery("Select  count(e.ID) from Eintraege e, Kategorien k, Verknuepfung v Where e.ID = v.EintragID AND v.KategorieID = k.ID AND UPPER(k.Name) = '"
						+ kat + "'");
		rs.next();
		int laenge = Integer.parseInt(rs.getString(1));
		rs.close();

		rs = st.executeQuery("Select  e.ID, e.Name, e.LAT, e.LANG from Eintraege e, Kategorien k, Verknuepfung v Where e.ID = v.EintragID AND v.KategorieID = k.ID AND UPPER(k.Name) = '"
				+ kat + "'");

		Eintrag[] ergList = new Eintrag[laenge];

		int i = 0;
		while (rs.next()) {
			Eintrag temp = new Eintrag();
			temp.setID(Integer.parseInt(rs.getString(1)));
			temp.setName(rs.getString(2));
			temp.setLat(Double.parseDouble(rs.getString(3)));
			temp.setLang(Double.parseDouble(rs.getString(4)));
			ergList[i] = temp;
			i++;
		}

		rs.close();
		st.close();
		con.close();

		return ergList;
	}

	public static Eintrag[] getErgebnisliste(String kat, double lat, double lng)
			throws SQLException, ClassNotFoundException {
		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");
		// SQL-Anweisungs-Objekt erzeugen
		Statement st = con.createStatement();

		kat = kat.toUpperCase();
		ResultSet rs = st
				.executeQuery("Select count(id) from (SELECT ID, Name, Lat, Lang, ( 6371 * acos( cos( radians("
						+ lat
						+ ") ) * cos( radians(lat ) ) * cos( radians( lang ) - radians("
						+ lng
						+ ") ) + sin( radians("
						+ lat
						+ ") ) * sin( radians( lat ) ) ) )  AS Ent From Eintraege) a, Eintraege e, Kategorien k, Verknuepfung v Where e.ID = v.EintragID AND v.KategorieID = k.ID AND UPPER(k.Name) = '"
						+ kat + "' AND a.Ent < 20   AND a.ID = e.ID;");
		rs.next();
		int laenge = Integer.parseInt(rs.getString(1));
		rs.close();

		rs = st.executeQuery("Select * from (SELECT ID, Name, Lat, Lang, ( 6371 * acos( cos( radians("
				+ lat
				+ ") ) * cos( radians(lat ) ) * cos( radians( lang ) - radians("
				+ lng
				+ ") ) + sin( radians("
				+ lat
				+ ") ) * sin( radians( lat ) ) ) )  AS Ent From Eintraege) a, Eintraege e, Kategorien k, Verknuepfung v Where e.ID = v.EintragID AND v.KategorieID = k.ID AND UPPER(k.Name) = '"
				+ kat
				+ "' AND a.Ent < 20   AND a.ID = e.ID ORDER BY a.Ent LIMIT 0, 20;");

		Eintrag[] ergList = new Eintrag[laenge];

		int i = 0;
		while (rs.next()) {
			Eintrag temp = new Eintrag();
			temp.setID(Integer.parseInt(rs.getString(1)));
			temp.setName(rs.getString(2));
			temp.setLat(Double.parseDouble(rs.getString(3)));
			temp.setLang(Double.parseDouble(rs.getString(4)));
			temp.setEnt(Double.parseDouble(rs.getString(5)));
			ergList[i] = temp;
			i++;
		}

		rs.close();
		st.close();
		con.close();

		return ergList;
	}

	
	public static Eintrag[] getErgebnisliste(String kat, double lat, double lng, int time, int day) throws SQLException,
	ClassNotFoundException {
Class.forName("org.hsqldb.jdbcDriver");
Connection con = DriverManager
		.getConnection(
				"jdbc:hsqldb:file:"+connection+";shutdown=true",
				"sa", "");
// SQL-Anweisungs-Objekt erzeugen
Statement st = con.createStatement();

kat = kat.toUpperCase();
ResultSet rs = st
		.executeQuery("Select count(id) from (SELECT ID, Name, Lat, Lang, ( 6371 * acos( cos( radians("+lat+") ) * cos( radians(lat ) ) * cos( radians( lang ) - radians("+lng+") ) + sin( radians("+lat+") ) * sin( radians( lat ) ) ) )  AS Ent From Eintraege) a, Eintraege e, Kategorien k, Verknuepfung v Where e.ID = v.EintragID AND v.KategorieID = k.ID AND UPPER(k.Name) = '"+kat+"' AND a.Ent < 20   AND a.ID = e.ID AND ((OZ"+day+" < "+time+" AND "+time+" < OZ"+(day+1)+") OR (OZ"+(day+2)+" < "+time+" AND "+time+" < OZ"+(day+3)+"));");
rs.next();
int laenge = Integer.parseInt(rs.getString(1));
rs.close();

rs = st.executeQuery("Select * from (SELECT ID, Name, Lat, Lang, ( 6371 * acos( cos( radians("+lat+") ) * cos( radians(lat ) ) * cos( radians( lang ) - radians("+lng+") ) + sin( radians("+lat+") ) * sin( radians( lat ) ) ) )  AS Ent From Eintraege) a, Eintraege e, Kategorien k, Verknuepfung v Where e.ID = v.EintragID AND v.KategorieID = k.ID AND UPPER(k.Name) = '"+kat+"' AND a.Ent < 20  AND ((OZ"+day+" < "+time+" AND "+time+" < OZ"+(day+1)+") OR (OZ"+(day+2)+" < "+time+" AND "+time+" < OZ"+(day+3)+"))  AND a.ID = e.ID ORDER BY a.Ent LIMIT 0, 20;");

Eintrag[] ergList = new Eintrag[laenge];

int i = 0;
while (rs.next()) {
	Eintrag temp = new Eintrag();
	temp.setID(Integer.parseInt(rs.getString(1)));
	temp.setName(rs.getString(2));
	temp.setLat(Double.parseDouble(rs.getString(3)));
	temp.setLang(Double.parseDouble(rs.getString(4)));
	temp.setEnt(Double.parseDouble(rs.getString(5)));
	ergList[i] = temp;
	i++;
}

rs.close();
st.close();
con.close();

return ergList;
}


	public static User[] getUser() throws SQLException, ClassNotFoundException {
		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");

		// SQL-Anweisungs-Objekt erzeugen
		Statement st = con.createStatement();

		ResultSet rs = st.executeQuery("Select count(User) From User");
		rs.next();
		int laenge = Integer.parseInt(rs.getString(1));
		rs.close();

		rs = st.executeQuery("Select * From User");

		User[] usr = new User[laenge];

		int i = 0;
		while (rs.next()) {
			User temp = new User(rs.getString(1), rs.getString(2),
					rs.getString(3));
			usr[i] = temp;
			i++;
		}

		rs.close();
		st.close();
		con.close();

		return usr;
	}

	public static void addUserZuEintrag(String eintr, String usr)
			throws SQLException, ClassNotFoundException {
		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");

		// SQL-Anweisungs-Objekt erzeugen
		Statement st = con.createStatement();

		ResultSet rs = st
				.executeQuery("select id from eintraege where name = '" + eintr
						+ "'");
		rs.next();

		st.executeUpdate("Insert Into UsrVerknuepfung (User,EintragID) Values ( '"
				+ usr + "', " + Integer.parseInt(rs.getString(1)) + "  )");

		rs.close();
		st.close();
		con.close();
	}

	public static String getUserVonEintrag(String eintr) throws SQLException,
			ClassNotFoundException {
		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");

		// SQL-Anweisungs-Objekt erzeugen
		Statement st = con.createStatement();
		ResultSet rs = st
				.executeQuery("select id from eintraege where name = '" + eintr
						+ "'");
		rs.next();

		rs = st.executeQuery("select * from UsrVerknuepfung where eintragid ="
				+ Integer.parseInt(rs.getString(1)));
		rs.next();
		String usr = rs.getString(1);

		rs.close();
		st.close();
		con.close();

		return usr;
	}

	public static void daleteUserVonEintrag(String eintr) throws SQLException,
			ClassNotFoundException {
		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");

		// SQL-Anweisungs-Objekt erzeugen
		Statement st = con.createStatement();
		ResultSet rs = st
				.executeQuery("select id from eintraege where name = '" + eintr
						+ "'");
		rs.next();

		st.executeUpdate("Delete from usrVerknuepfung where eintragid = "
				+ Integer.parseInt(rs.getString(1)));

		rs.close();
		st.close();
		con.close();
	}

	public static void addUser(User usr) throws SQLException,
			ClassNotFoundException {
		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");

		// SQL-Anweisungs-Objekt erzeugen
		Statement st = con.createStatement();

		st.executeUpdate("INSERT INTO User (User, Password, Role) Values ('"
				+ usr.getUser() + "', '" + usr.getPassword() + "', '"
				+ usr.getRole() + "')");

		st.close();
		con.close();

	}

	public static void editUser(User usr) throws SQLException,
			ClassNotFoundException {
		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");

		// SQL-Anweisungs-Objekt erzeugen
		Statement st = con.createStatement();

		st.executeUpdate("DELETE from User u WHERE u.User='" + usr.getUser()
				+ "'");

		st.executeUpdate("INSERT INTO User (User, Password, Role) Values ('"
				+ usr.getUser() + "', '" + usr.getPassword() + "', '"
				+ usr.getRole() + "')");

		st.close();
		con.close();

	}

	public static void deleteUser(String username) throws SQLException,
			ClassNotFoundException {
		Class.forName("org.hsqldb.jdbcDriver");
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");

		// SQL-Anweisungs-Objekt erzeugen
		Statement st = con.createStatement();

		st.executeUpdate("DELETE from User u WHERE u.User='" + username + "'");

		st.close();
		con.close();

	}

	public static String getSelectAllString() throws SQLException,
			ClassNotFoundException {
		// spezifische Datenbanktreiber laden
		Class.forName("org.hsqldb.jdbcDriver");

		// Verbindung zur Datenbank "test" aufbauen
		Connection con = DriverManager.getConnection("jdbc:hsqldb:file:"
				+ connection + ";shutdown=true", "sa", "");

		// SQL-Anweisungs-Objekt erzeugen
		Statement st = con.createStatement();
		ResultSet rs = st.executeQuery("SELECT * FROM Standorte");
		String all = new String("");

		// Resultat der SQL-Anweisung verarbeiten
		/*
		 * for (int i=1; rs.next() ; i++){ all = all + rs.getString(i); }
		 */

		while (rs.next()) {
			all = "\t" + all + rs.getString(1) + " | ";
			all = all + rs.getString(2) + " | ";
			all = all + rs.getString(3) + " | ";
			all = all + rs.getString(4) + " ";

		}

		rs.close();
		st.close();
		con.close();

		return all;
	}

	public static String setZeitNull(int uhrzeit) {
		String temp = Integer.toString(uhrzeit);
		int leng = temp.length();
		if (leng < 4) {
			for (; leng < 4; leng++) {
				temp = "0" + temp;
			}
		}

		return temp;
	}

}
